﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AutoMapper;
using System.Reflection;
using System.IO;
namespace JCode.Common
{
    public static class ModelMapExtensions
    {
        static IList<string> createMpas = new List<string>();
       
        public  static void InitMaps()
        {
            //获得解决方案的所有Assembly
            

            var AssemblyName = System.Reflection.Assembly.GetExecutingAssembly().FullName;

            Assembly[] AX = AppDomain.CurrentDomain.GetAssemblies();

            Assembly currentA = Assembly.GetExecutingAssembly();//当前【类库】程序集

            foreach (FileInfo f in new DirectoryInfo(AppDomain.CurrentDomain.RelativeSearchPath).GetFiles("*.dll"))
            {
                var a = Assembly.LoadFrom(f.FullName);
                //如果已加载一个具有相同标识的程序集，则即使指定了不同的路径，LoadFrom 仍返回已加载的程序集。避免重复加载
                //if (a != currentA)//不比较当前类库
                //{
                //    string np = a.GetName().Name + ".Core" + target_namespace + "Site";
                //    object x = a.CreateInstance(np, true);
                //    if (!x.IsNull())//测试指定命名空间的类是否存在。
                //    {
                //        VPage.TargetAssembly = a;
                //        o = x;
                //        break;
                //    }
                //}
                //缺陷1、若有“用户类库”拥有 类库名.Core.Site 的重复类，就有问题了。
                //缺陷2、首次加载要进行遍历。
            }


            //遍历显示每个Assembly的名字
            foreach (object var in AX)
            {
                string ss = var.ToString();

            }
        }

        public static TDestination ToMap<TSource, TDestination>(this TSource source)
        {
            if (source == null) return default(TDestination);

            if (source.GetType().IsGenericType)
            {
                var key = typeof(TSource).FullName + typeof(TDestination).FullName;
                if (!createMpas.Contains(key))
                {
                    Mapper.CreateMap(typeof(TSource).GetGenericArguments()[0], typeof(TDestination).GetGenericArguments()[0]);
                    createMpas.Add(key);
                }
                return Mapper.Map<TSource, TDestination>(source);
            }

            return Mapper.DynamicMap<TSource, TDestination>(source);
        }
    }
}
